package com.lex.crossgate.admin.common.support.redis;

import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.stereotype.Component;

import java.util.Collection;
import java.util.Date;
import java.util.Set;
import java.util.concurrent.TimeUnit;
import java.util.stream.Collectors;
import java.util.stream.Stream;

@Slf4j
@Component
public class RedisUtil {

    @Autowired
    private RedisTemplate redisTemplate;

    /**
     * 默认过期时长，单位：秒
     */
    public static final long DEFAULT_EXPIRE = 60 * 60 * 24;

    /**
     * 不设置过期时长
     */
    public static final long NOT_EXPIRE = -1;

    /**
     * @Author: 李贝留斯
     * @Description: 根据key获取对象
     * @Param: [key]
     * @Return: java.lang.Object
     * @date: 2018/11/8 15:15
     */
    public Object getObject(String key){
        return redisTemplate.opsForValue().get(key);
    }

    /**
     * @Author: 李贝留斯
     * @Description:设置key并设置缓存时间
     * @Param: [key, value, expiretime]
     * @Return: java.lang.Boolean
     * @date: 2018/11/8 15:25
     */
    public Boolean setObject(String key, Object value, int expiretime){
        redisTemplate.opsForValue().set(key,value);
        redisTemplate.expire(key,expiretime,TimeUnit.SECONDS);
        return false;
    }

    /**
     * @Author: 李贝留斯
     * @Description:判断key是否存在
     * @Param: [key]
     * @Return: boolean
     * @date: 2018/11/8 14:51
     */
    public boolean existsKey(String key) {
        return redisTemplate.hasKey(key);
    }
    /**
     * @Author: 李贝留斯
     * @Description: 重名名key，如果newKey已经存在，则newKey的原值被覆盖
     * @Param: [oldKey, newKey]
     * @Return: void
     * @date: 2018/11/8 14:55
     */
    public void renameKey(String oldKey, String newKey) {
        redisTemplate.rename(oldKey, newKey);
    }

    /**
     * @Author: 李贝留斯
     * @Description: newKey不存在时才重命名
     * @Param: [oldKey, newKey]
     * @Return: boolean
     * @date: 2018/11/8 14:56
     */
    public boolean renameKeyNotExist(String oldKey, String newKey) {
        return redisTemplate.renameIfAbsent(oldKey, newKey);
    }
    /**
     * @Author: 李贝留斯
     * @Description: 删除key
     * @Param: [key]
     * @Return: void
     * @date: 2018/11/8 14:57
     */
    public void deleteKey(String key) {
        redisTemplate.delete(key);
    }
    /**
     * @Author: 李贝留斯
     * @Description: 删除多个key
     * @Param: [keys]
     * @Return: void
     * @date: 2018/11/8 14:58
     */
    public void deleteKey(String[] keys) {
        Set<String> kSet = Stream.of(keys).map(k -> k).collect(Collectors.toSet());
        redisTemplate.delete(kSet);
    }
    /**
     * @Author: 李贝留斯
     * @Description: 删除Key的集合
     * @Param: [keys]
     * @Return: void
     * @date: 2018/11/8 14:58
     */
    public void deleteKey(Collection<String> keys) {
        Set<String> kSet = keys.stream().map(k -> k).collect(Collectors.toSet());
        redisTemplate.delete(kSet);
    }

    /**
     * @Author: 李贝留斯
     * @Description:设置key的生命周期
     * @Param: [key, time, timeUnit]
     * @Return: void
     * @date: 2018/11/8 14:59
     */
    public void expireKey(String key, long time, TimeUnit timeUnit) {
        redisTemplate.expire(key, time, timeUnit);
    }

    /**
     * @Author: 李贝留斯
     * @Description:指定key在指定的日期过期
     * @Param: [key, date]
     * @Return: void
     * @date: 2018/11/8 14:59
     */
    public void expireKeyAt(String key, Date date) {
        redisTemplate.expireAt(key, date);
    }

    /**
     * @Author: 李贝留斯
     * @Description:查询key的生命周期
     * @Param: [key, timeUnit]
     * @Return: long
     * @date: 2018/11/8 14:59
     */
    public long getKeyExpire(String key, TimeUnit timeUnit) {
        return redisTemplate.getExpire(key, timeUnit);
    }

    /**
     * @Author: 李贝留斯
     * @Description:将key设置为永久有效
     * @Param: [key]
     * @Return: void
     * @date: 2018/11/8 14:59
     */
    public void persistKey(String key) {
        redisTemplate.persist(key);
    }
}
